package com.concurrency.example.deadLock.p2;

import java.awt.*;

/**
 * 大多数情况获取多重锁不像LeftRightDeadLock那么明显
 *
 */
public class Test {
    public static void main(String[] args) {

        Dispatcher dispatcher = new Dispatcher();
        Taxi taxi = new Taxi(new Point(3,3), new Point(4,4), dispatcher);
        dispatcher.setTaxis(taxi);
        /*
            这个线程更新车辆位置，因为更新后车辆到达目的地，所以还调用notifyAvailable()方法
            也就是说这个线程先持有Taxi对象锁，然后持有Dispatcher对象锁
         */
        new Thread(() ->{
            try {
                taxi.setLocation(new Point(4, 4));
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }).start();
        /*
            这个线程获取所有车辆位置
            先持有Dispatcher对象锁，然后持有Taxi对象锁
         */
        new Thread(() ->{
            try {
               String image = dispatcher.getImage();
                System.out.println("所有车辆位置：" + image);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }).start();

        /*
         * 第一个线程获取锁顺序：dispatcher -> taxi
         * 第二个线程获取锁顺序：taxi -> dispatcher
         * 都再等对方释放锁，造成死锁
         */
    }
}
